home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1994 / MacHack 1994.toast / MacHack™94 / Talks & Papers / Timothy Knox / yerk 3.66 / Asm source / BuildRegMask < prev    next >
Text File  |  1994-06-24  |  2KB  |  81 lines

  1. \ BuildRegMask                  ReeseWarner                         5/13
  2. \  for MOVEM
  3. \  03/06/86  GDC  fixed MOVEM
  4. \  01/16/94     rfl    added mrh's regbit and revmask for movem fix. Delete setreg.
  5. 0 -> dlevel
  6.  
  7. operand exPtr
  8.  
  9. \  is first char in string = char?
  10. : Char= { addr len char -- bool }
  11.     addr c@ char =
  12. ;
  13.  
  14. \ \  for / in MOVEM
  15. \ : setReg    { mode reg# flag work \ shift -- work }
  16. \     flag
  17. \     IF                                      \ if regular mask
  18. \         mode 8 * reg# + 1 swap << work or -> work
  19. \     ELSE
  20. \         mode 0=
  21. \         IF
  22. \             8 -> shift
  23. \         ELSE
  24. \             0 -> shift
  25. \         THEN
  26. \         8 reg# - ++> shift
  27. \         1 shift 1- << work or -> work
  28. \     THEN
  29. \     work val" work is "
  30. \ ;
  31.  
  32. : REGBIT  { mode reg# -- n }
  33.     1
  34.     reg#  mode 1 =    \ anmode=1
  35.     IF    8 +
  36.     THEN
  37.     <<  ;
  38.  
  39. \ Flag indicates whether it is regular or pre-decrement
  40. \  1 = regular
  41. \  0 = predecrement
  42. \  modes   0 data register
  43. \          1 address register
  44. : BuildRegMask  { opPtr flag \ tokentype work -- regMask }
  45.     0 -> work
  46.     BEGIN
  47.         nextToken -> tokentype         \ if next token is , or eol then
  48.         get: token ascii , char=       \ get out
  49.         tokentype eol = or not
  50.     WHILE
  51.         msg" in WHILE "
  52.         get: token ascii / char=
  53.         IF
  54.             msg" IT'S A / "
  55.             mode: opPtr reg: opPtr regBit work or -> work
  56.             opPtr getOp
  57.          ELSE
  58.             msg" ITSA something else "
  59.             exPtr getOp
  60.             mode: opPtr mode: exPtr = not
  61.             IF
  62.                 210 asmError
  63.             ELSE
  64.                 reg: exPtr 1+ reg: opPtr
  65.                 DO
  66.                     mode: opPtr i regBit work  or -> work
  67.                 LOOP
  68.             THEN
  69.         THEN
  70.     REPEAT
  71.     mode: opPtr reg: opPtr regBit  work or -> work
  72.     work
  73. ;
  74.  
  75.  
  76. : REVMASK  { mask  -- mask' }  \ Reverses the mask bits for predecrement mode.
  77.     0 16 0 DO 2* mask 1 and or
  78.             mask 2/ -> mask
  79.         LOOP  ;
  80.